/*******************************************************************************
* Имя файла: colorConsole.cpp
* Дата: 23-04-2024
* Разработчик: Андрей Подлегаев
* На основе кода: Dr. Moritz Lehmann,
* theoretical physicist at the University of Bayreuth
* Лицензия: BSD
* Описание: Использование цветов в выводе консоли
* *****************************************************************************/
#include "colorConsole.h"

std::string TextColorCode(const int textColor)
{
  switch(textColor) {
    case 0: return "30"; // color_black      0
    case 1: return "34"; // color_dark_blue  1
    case 2: return "32"; // color_dark_green 2
    case 3: return "36"; // color_light_blue 3
    case 4: return "31"; // color_dark_red   4
    case 5: return "35"; // color_magenta    5
    case 6: return "33"; // color_orange     6
    case 7: return "37"; // color_light_gray 7
    case 8: return "90"; // color_gray       8
    case 9: return "94"; // color_blue       9
    case 10: return "92"; // color_green     10
    case 11: return "96"; // color_cyan      11
    case 12: return "91"; // color_red       12
    case 13: return "95"; // color_pink      13
    case 14: return "93"; // color_yellow    14
    case 15: return "97"; // color_white     15
    default: return "37";
    }
}
std::string BackgroundColorCode(const int backgroundColor)
{
  switch(backgroundColor) {
    case 0: return "40"; // color_black      0
    case 1: return "44"; // color_dark_blue  1
    case 2: return "42"; // color_dark_green 2
    case 3: return "46"; // color_light_blue 3
    case 4: return "41"; // color_dark_red   4
    case 5: return "45"; // color_magenta    5
    case 6: return "43"; // color_orange     6
    case 7: return "47"; // color_light_gray 7
    case 8: return "100"; // color_gray       8
    case 9: return "104"; // color_blue       9
    case 10: return "102"; // color_green     10
    case 11: return "106"; // color_cyan      11
    case 12: return "101"; // color_red       12
    case 13: return "105"; // color_pink      13
    case 14: return "103"; // color_yellow    14
    case 15: return "107"; // color_white     15
    default: return "40";
    }
}

std::string getPrintColor(const int textColor)
{
  return "\033[" + TextColorCode(textColor) + "m";
}

std::string getPrintColor(const int textColor, const int backgroundColor)
{
  return "\033[" + TextColorCode(textColor) + ";" + BackgroundColorCode(backgroundColor) + "m";
}

void printColor(const int textColor){
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, textColor);
#elif defined(__linux__)
  std::cout << getPrintColor(textColor);
#endif // Windows/Linux
}

void printColor(const int textColor, const int backgroundColor)
{
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, backgroundColor << 4 | textColor);
#elif defined(__linux__)
  std::cout << getPrintColor(textColor, backgroundColor);
#endif // Windows/Linux
}

void printColorReset()
{
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, 7); // reset color
#elif defined(__linux__)
  std::cout << "\033[0m"; // reset color
#endif // Windows/Linux
}

void println(const std::string &str)
{
  std::cout << str << std::endl;
}

void print(const std::string &str)
{
  std::cout << str;
}

void print(const std::string &str, const int textColor)
{
  printColor(textColor);
  std::cout << str;
  printColorReset();
}

void print(const std::string &str, const int textColor, const int backgroundColor)
{
  printColor(textColor, backgroundColor);
  std::cout << str;
  printColorReset();
}

void printNoReset(const std::string &str, const int textColor)
{
  printColor(textColor);
  std::cout << str;
}

void printNoReset(const std::string &str, const int textColor, const int backgroundColor)
{
  printColor(textColor, backgroundColor);
  std::cout << str;
}
